package com.zy.基础.流程控制

import scala.collection.immutable
import scala.util.control.Breaks

object Test {

  def main(args: Array[String]): Unit = {

    val age: Int = 18

    // if else在scala中可以有返回值  返回时无需加return，否则会视为方法的return
    val result1: String = if (age >= 18) {
      println("成年")
      "已经成年了"
    } else {
      println("未成年")
      "还没有成年"
    }
    println(result1)

    println("=============================")

    // scala中没有三元运算符，使用以下替代 if else
    val result2: String = if (age >= 18) "成年" else "未成年"
    println(result2)

    println("=============================")

    // 范围遍历 相当于for(i <- 1.to(10))
    for (i <- 1 to 10) {
      print(i + " ")
    }
    println()
    // 范围遍历 右边不包含
    for (i <- 1 until 10) {
      print(i + " ")
    }

    println()
    println("=============================")

    // 集合遍历
    for (i <- Array(1, 2, 3, 4, 5, 6, 0)) {
      print(i + " ")
    }

    println()
    println("=============================")

    // 循环守卫  在for循环后限制遍历参数类型，在for括号内加if关键字  可以替代continue关键字
    for (i <- 1 to 10 if i > 5) {
      print(i + " ")
    }

    println()
    println("=============================")

    // 循环步长 根据指定间隔取数  通过调用关键词by
    for (i <- 1 to 10 by 2) {
      print(i + " ")
    }

    println()
    println("=============================")

    // 替代多重for循环 打印乘法表
    for (i <- 1 to 9; j <- 1 to i) {
      print(s"${i} * ${j} = ${i * j}\t")
      if (i == j) println()
    }

    println()
    println("=============================")

    // for循环引入变量 将变量生命在for列表中，常约定为使用中括号
    for (i <- 1 to 2; j = i - 1) {
      println(s"${i}\t${j}")
    }
    for {
      i <- 1 to 2
      j = i - 1} {
      println(s"${i}\t${j}")
    }

    println()
    println("=============================")

    // for循环返回值，默认为Unit，可以使用yield关键字将数据重定到返回值
    val ints: immutable.IndexedSeq[Int] = for (i <- 1 to 10) yield i * 2
    println(ints)

    // while 和 do while 使用方法与java相同

    println()
    println("=============================")

    // 循环无法直接使用break退出，因为scala中无break
    // 可以借助Breaks类来进行退出操作，原理为抛出异常中断循环
    Breaks.breakable(
      for (i <- 1 to 10) {
        if (i == 3)
          Breaks.break()
        print(i + " ")
      }
    )

    println()
    println("=============================")

  }
}
